package com.oop.example.processing;

import com.oop.example.xml.Entry;
import com.oop.example.xml.ObjectFactory;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXB;

/**
 *
 * @author -
 */
public abstract class Parser {

    protected String string;
    protected String errMessage;
    protected int errPos = -1;
    private Entry entry = null;
    protected List<Entry> alternativeEntrys = null;
    protected ObjectFactory factory = new ObjectFactory();

    public Entry getEntry() {
        if (entry == null) {
            entry = factory.createEntry();
            entry.setEntryAttributes(factory.createEntryEntryAttributes());
            entry.getEntryAttributes().setIndexInclude(true);
        }
        return entry;
    }

    public List<Entry> getAlternativeEntrys() {
        if (alternativeEntrys == null) {
            alternativeEntrys = new ArrayList<Entry>();
        }
        return alternativeEntrys;
    }

    public int getErrPosition() {
        return errPos;
    }

    public void setErrPosition(int errPos) {
        this.errPos = errPos;
    }

    public String getErrMessage() {
        return errMessage;
    }

    public void setErrMessage(String errMessage) {
        this.errMessage = errMessage;
    }

    public void setString(String string) {
        this.string = string;
    }

    public String getString() {
        return string;
    }

    public String asString() {
        StringWriter wr = new StringWriter();
        JAXB.marshal(entry, wr);
        String res = wr.toString();
        if (alternativeEntrys != null && alternativeEntrys.size() > 0) {
            for (Entry alterEntry : alternativeEntrys) {
                wr = new StringWriter();
                JAXB.marshal(alterEntry, wr);
                res += "\n" + wr.toString();
            }
        }
        return res;
    }

    /**
     * Предварительная проверка на применимость парсра к данной статье
     * @return false, если парсер не применим к статье
     */
    public abstract boolean isApplicable();

    /**
     * Парсинг статье
     * @throws ParseError
     */
    public abstract void parse() throws ParseError;

    /**
     * Возвращает карту токенов,содержащихся в статье
     * @return
     */
    public abstract TockenMap getTockenMap();
}
